package com.ks.utils;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

/**
 * 比较某个表的属性值改变情况，并返回相关信息  属性名：原值-->更新值
 * 必要条件：比较的属性必须含有@SComAnno注解，属性名采用@SComAnno注解中的comment值
 * @author pks
 * @version 2017年12月5日
 */
public class SUtilCompiler {
	
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	/**
	 * @param obj		未改变之前的表属性
	 * @param update	更新后的表属性
	 * @param str		筛选只要比较的属性名（为空或为null比较所有注解@SComAnno的属性）
	 * @return
	 */
	public static String compiler(Object obj,Object update,String[] str) {
		try {
			List<String> names = null;
			if(str!=null && str.length>0){
				names = Arrays.asList(str);
			}
			StringBuilder sb = new StringBuilder();
			if(update.getClass().getName().equals(obj.getClass().getName())){
				Class<?> demo = update.getClass();
				Field[] field = demo.getDeclaredFields();
				for (Field f : field) {
					f.setAccessible(true);
					if(names==null || (names!=null && names.contains(f.getName()))){
						boolean bool = false;
						if(f.get(update)==null && f.get(obj)!=null){
							bool = true;
						}else if(f.get(update)!=null && !f.get(update).equals(f.get(obj))){
							bool = true;
						}
						if(bool){
							if(f.isAnnotationPresent(SComAnno.class)){
								SComAnno d = f.getAnnotation(SComAnno.class);
								Class<?> fieldType = f.getType();
								if(fieldType.getName().endsWith("Date")){
									sb.append(d.name() + ":" + (f.get(obj)==null?null:sdf.format((Date)f.get(obj))) + "-->" + (f.get(update)==null?null:sdf.format((Date)f.get(update))) + ",");
								}else if(fieldType.getName().equals("java.lang.Integer")){
									String convert = d.convert();
									if(StringUtils.isNotBlank(convert)){
										Map<String, String> map = new HashMap<String, String>();
										String[] temp = convert.split("\\|\\|");
										for (String s : temp) {
											String[] temp2 = s.split("=");
											map.put(temp2[0], temp2[1]);
										}
										sb.append(d.name() + ":" + (f.get(obj)==null?f.get(obj):map.get(f.get(obj).toString())) + "-->" + (f.get(update)==null?f.get(update):map.get(f.get(update).toString())) + ",");
									}
								}else{
									sb.append(d.name() + ":" + f.get(obj) + "-->" + f.get(update) + ",");
								}
							}
						}
					}
				}
			}
			String result = sb.toString();
			if(StringUtils.isNotBlank(result)){
				result = result.substring(0,result.length()-1);
			}
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}


	public static void main(String[] args) throws Exception {
		User obj = new User();
		User update = new User();
		obj.setName("测试1111");
		obj.setBirthday(new Date());
		update.setName("测试2222");
		update.setAge(11);
		System.out.println(compiler(obj, update,null));
		
	}
	
}

